home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / dorskel2.arc / MTASK.C < prev    next >
C/C++ Source or Header  |  1991-12-05  |  3KB  |  145 lines

  1. /**********************************************************/
  2. /* Functions to help DOORSKEL get along with multitaskers */
  3. /* and other mumbo-jumbo                                  */
  4. /**********************************************************/
  5.  
  6. #include "doorskel.h"
  7.  
  8. static union REGS rg;
  9. static int mtask = 0;            /* type of multitasker, if any */
  10.  
  11. #define DVID    1
  12. #define DDOSID  2
  13. #define MOSID   3
  14. #define TVID    4
  15.  
  16. static int  _fastcall is_dv (void);
  17. static int  _fastcall is_ddos (void);
  18. static int  _fastcall is_mos (void);
  19. static int  _fastcall is_tv (void);
  20. static void _fastcall pause_dv (void);
  21. static void _fastcall pause_ddos (void);
  22. static void _fastcall pause_tv (void);
  23. static void _fastcall pause_mos (void);
  24.  
  25.  
  26.  
  27.  
  28.  
  29. void _fastcall set_mtask (void) {
  30.  
  31.     if(is_dv()) mtask=DVID;
  32.     else if(is_ddos()) mtask=DDOSID;
  33.     else if(is_mos()) mtask=MOSID;
  34.     else if(is_tv()) mtask=TVID;
  35. }
  36.  
  37.  
  38. static int _fastcall is_dv (void) {
  39.  
  40.     rg.x.cx=0x04445;
  41.     rg.x.dx=0x05351;
  42.     rg.x.ax=0x02b01;
  43.     int86(0x21,&rg,&rg);
  44.     if(rg.h.al==0x0ff) return 0;
  45.     return rg.x.bx;
  46. }
  47.  
  48.  
  49. int _fastcall is_ddos (void) {
  50.  
  51.     rg.h.ah=0x0e4;
  52.     int86(0x21,&rg,&rg);
  53.     if(rg.h.al==1 || rg.h.al==2) return 1;
  54.     return 0;
  55. }
  56.  
  57.  
  58. int _fastcall is_mos (void) {
  59.  
  60.     int temp;
  61.  
  62.     rg.h.ah=0x030;
  63.     int86(0x21,&rg,&rg);
  64.     temp=rg.x.ax;
  65.     rg.x.ax=0x03000;
  66.     rg.x.bx=0x03000;
  67.     rg.x.cx=0x03000;
  68.     rg.x.dx=0x03000;
  69.     int86(0x21,&rg,&rg);
  70.     if(rg.x.ax==temp) return temp;
  71.     return 0;
  72. }
  73.  
  74.  
  75. int _fastcall is_tv (void) {
  76.  
  77.     rg.x.ax=0x01022;
  78.     rg.x.bx=0;
  79.     int86(0x15,&rg,&rg);
  80.     if(!rg.x.bx) return 0;
  81.     return rg.x.bx;
  82. }
  83.  
  84.  
  85. void _fastcall pause_dv (void) {
  86.  
  87.     rg.x.ax = 0x0101a;
  88.     int86(0x15,&rg,&rg);
  89.     rg.x.ax = 0x01000;
  90.     int86(0x15,&rg,&rg);
  91.     rg.x.ax = 0x01025;
  92.     int86(0x15,&rg,&rg);
  93. }
  94.  
  95.  
  96. void _fastcall pause_ddos (void) {
  97.  
  98.     int86(0xf4,&rg,&rg);
  99. }
  100.  
  101.  
  102. void _fastcall pause_tv (void) {
  103.  
  104.     rg.x.ax = 0x01000;
  105.     int86(0x15,&rg,&rg);
  106. }
  107.  
  108.  
  109. void _fastcall pause_mos (void) {
  110.  
  111.     rg.x.ax = 0x0703;
  112.     rg.x.bx = 0x03;
  113.     rg.x.cx = 0;
  114.     rg.x.dx = 0;
  115.     int86(0x38,&rg,&rg);
  116. }
  117.  
  118.  
  119. void _fastcall pause_mtask (void) {
  120.  
  121.    switch(mtask) {
  122.         case 0:         break;
  123.         case DVID:      pause_dv();
  124.                         break;
  125.         case DDOSID:    pause_ddos();
  126.                         break;
  127.         case TVID:      pause_tv();
  128.                         break;
  129.         case MOSID:     pause_mos();
  130.                         break;
  131.     }
  132.     int86(0x28,&rg,&rg);    /* DOS scheduler interrupt */
  133. }
  134.  
  135.  
  136.  
  137. void _fastcall my_sleep (int secs) {         /* snooze a while */
  138.  
  139.     clock_t t1;
  140.  
  141.  
  142.     t1 = clock() + ((clock_t)secs * (clock_t)CLOCKS_PER_SEC);
  143.     while(clock() < t1) pause_mtask();
  144. }
  145.